<?php

namespace app\observer;

use app\model\UserRefreshToken;
use think\facade\Db;

class UserRefreshTokenObserver
{
    public function onBeforeUpdate($model)
    {
        // 获取临时属性，如果未设置则使用默认值
        $operationType = 'refresh';
        if (method_exists($model, 'getOperationType')) {
            $operationType = $model->getOperationType();
        }
        
        // 将原有的 recordUsage 逻辑移到这里
        $this->appendUsageRecord($model, $operationType);
    }

    public function onBeforeInsert($model)
    {
        $this->appendUsageRecord($model, 'create');
    }

    protected function appendUsageRecord($model, $type = "other")
    {
        // 创建新的使用记录
        $newRecord = [
            "ip" => request()->ip(),
            "user_agent" => request()->header("user-agent"),
            "time" => date("Y-m-d H:i:s"),
            "type" => $type,
        ];
        
        // 获取当前已有的meta数据
        // 注意：对于更新操作，$model->meta 可能已经是修改后的值，这里需要获取原始值
        // 使用 getOrigin 方法获取字段的原始值更安全
        $currentMeta = $model->meta ?: [];
        
        // 如果原始数据是字符串（如JSON），可能需要反序列化
        if (is_string($currentMeta)) {
            $currentMeta = json_decode($currentMeta, true) ?: [];
        }

        // 确保是索引数组格式
        if (!empty($currentMeta) && !isset($currentMeta[0])) {
            $currentMeta = [$currentMeta];
        }

        // 如果$currentMeta不是数组，初始化为空数组
        if (!is_array($currentMeta)) {
            $currentMeta = [];
        }

        // 追加新记录并限制条数
        $currentMeta[] = $newRecord;
        $updatedMeta = array_slice($currentMeta, -10); // 保留最近10条

        // 将处理好的新meta数据设置回模型，触发修改器（如果定义了的话）
        $model->setAttr('meta', $updatedMeta);
    }
}